#ifndef SERIALINATOR_H
#define SERIALINATOR_H

#include <string>
#include "../BloqArch/IRegistro.h"
#include "../HashExtensible/RegistroHash.h"



class SerialInator {
	private:
		int _posActual;
		unsigned int _cantBytes;
	public:
		SerialInator();
		~SerialInator();

		// Permite cambiar el modo de serializar a des-serializar o visceversa
		void reset();

		// Devuelve la cantidad de bytes en el buffer
		unsigned int getBufferSize() const;

		// Serializa cada tipo de dato de la forma correcta
		void serializar(char* &arrBytes, char c);
		void serializar(char* &arrBytes, int valor);
		void serializar(char* &arrBytes, unsigned int valor);
		void serializar(char* &arrBytes, unsigned short int valor);
		void serializar(char* &arrBytes, unsigned long int valor);
		void serializar(char* &arrBytes, std::string cadena);
		void serializar(char* &arrBytes, IRegistro* reg);
		void serializar(char* &arrBytes, RegistroHash reg);
//		void serializar(char* &arrBytes, TablaHash &tab);

		// Des-serializa los tipos de datos del buffer
		void desSerializar(char* arrBytes, char &c);
		void desSerializar(char* arrBytes, int &valor);
		void desSerializar(char* arrBytes, unsigned int &valor);
		void desSerializar(char* arrBytes, unsigned short int &valor);
		void desSerializar(char* arrBytes, unsigned long int &valor);
		void desSerializar(char* arrBytes, std::string &cadena);
		void desSerializar(char* arrBytes, IRegistro* &reg);
		void desSerializar(char* arrBytes, RegistroHash& reg);
//		void desSerializar(char* arrBytes, TablaHash &tab);
		
		// Para saber el tamaño de un string que se serializar
		static unsigned int getSizeOf(std::string s);
};


#endif

